﻿using System;
using System.Collections.Generic;
using System.Linq;
using Vallejos.Entidades.Interfaces;
using Vallejos.Entidades.ModeloDeDatos;
using Vallejos.Mensajes;
using Vallejos.Datos.Accesos;


namespace Vallejos.Negocio
{
    public class ComunBLL : IComun
    {
        private MensajesMgr _mensaje;
        private readonly ComunDAL _comun;
        private readonly HelperCache _cache;

        public ComunBLL()
        {
            _comun = new ComunDAL();
            _cache = new HelperCache();
        }

        public InformacionDeEmpresa LeerInformacionDeEmpresa(int id)
        {
            return _comun.LeerInformacionDeEmpresa(id);
        }

        public InformacionDomiciliaria LeerInformacionDomiciliaria(int id)
        {
            return _comun.LeerInformacionDomiciliaria(id);
        }

        public InformacionPersonal LeerInformacionPersonal(int id, int idLenguaje)
        {
            var info = _comun.LeerInformacionPersonal(id);

            info.Sexo = LeerSexos(idLenguaje).Single(sexo => sexo.IdSexo == info.Sexo.IdSexo);
            return info;
        }

        public List<Sexo> LeerSexos(int idLenguaje)
        {
            return _cache.ObtenerLista<Sexo>() ?? _cache.SetearLista(_comun.LeerSexos(idLenguaje));
        }


        public List<Provincia> LeerProvincias()
        {
            var provincias = _cache.ObtenerLista<Provincia>();

            if(provincias == null)
            {
                provincias = _comun.LeerProvincias();
                var localidades = LeerLocalidades();

                foreach (var provincia in provincias)
                    foreach (var localidad in localidades.Where(localidad => localidad.Provincia.Id == provincia.Id))
                        provincia.Localidades.Add(localidad);

                _cache.SetearLista(provincias);
            }
            return provincias;
        }

        public List<Localidad> LeerLocalidades()
        {
            return _cache.ObtenerLista<Localidad>() ?? _cache.SetearLista(_comun.LeerLocalidades());
        }

        public void AlmacenarEntidadEnEdicion<T>(T entidad)
        {
            _cache.AlmacenarEntidadEnEdicion(entidad);
        }

        public T RecuperarEntidadEnEdicion<T>()
        {
            return _cache.RecuperarEntidadEnEdicion<T>();
        }

        internal List<Localidad> LeerLocalidades(int idProvincia)
        {
            var localidades =
                LeerLocalidades().Where(localidad => localidad.Provincia.Id == idProvincia).ToList();
                        

            return localidades;
        }

        [Obsolete("Usar LeerInformacionPersonal(int id, int idLenguaje)")]
        public InformacionPersonal LeerInformacionPersonal(int id)
        {
            throw new System.NotImplementedException();
        }
    }
}
